package com.yt.base.controller.base;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.yt.base.controller.core.BaseController;
import com.yt.base.model.AclUser;
import com.yt.base.service.*;
import com.yt.base.util.Constants;
import com.yt.base.vo.UserMenuVo;
import com.yt.core.MsgBean;
import com.yt.util.DateUtils;
import com.yt.util.MD5Util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.Random;

@Controller
public class HomeController extends BaseController {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private AclUserService userService;

    @Autowired
    private AclUserOperationService userOpService;

    @Autowired
    private AclPrivilegeService aclPrivilegeService;

    @Autowired
    private AclCategoryService aclCategoryService;

    @Autowired
    private AclOperationService aclOperationService;

    private int width = 90; // 定义图片的width

    private int height = 40; // 定义图片的height

    private int codeCount = 4; // 定义图片上显示验证码的个数

    private int xx = 15;

    private int fontHeight = 30;

    private int codeY = 30;

    char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
            'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    @RequestMapping("/code")
    public void getCode(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {

        // 定义图像buffer
        BufferedImage buffImg = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // Graphics2D gd = buffImg.createGraphics();
        // Graphics2D gd = (Graphics2D) buffImg.getGraphics();
        Graphics gd = buffImg.getGraphics();
        // 创建一个随机数生成器类
        Random random = new Random();
        // 将图像填充为白色
        gd.setColor(Color.WHITE);
        gd.fillRect(0, 0, width, height);

        // 创建字体，字体的大小应该根据图片的高度来定。
        Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
        // 设置字体。
        gd.setFont(font);

        // 画边框。
        gd.setColor(Color.BLACK);
        gd.drawRect(0, 0, width - 1, height - 1);

        // 随机产生40条干扰线，使图象中的认证码不易被其它程序探测到。
        gd.setColor(Color.BLACK);
        for (int i = 0; i < 40; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            gd.drawLine(x, y, x + xl, y + yl);
        }

        // randomCode用于保存随机产生的验证码，以便用户登录后进行验证。
        StringBuffer randomCode = new StringBuffer();
        int red = 0, green = 0, blue = 0;

        // 随机产生codeCount数字的验证码。
        for (int i = 0; i < codeCount; i++) {
            // 得到随机产生的验证码数字。
            String code = String.valueOf(codeSequence[random.nextInt(34)]);
            // 产生随机的颜色分量来构造颜色值，这样输出的每位数字的颜色值都将不同。
            red = random.nextInt(255);
            green = random.nextInt(255);
            blue = random.nextInt(255);

            // 用随机产生的颜色将验证码绘制到图像中。
            gd.setColor(new Color(red, green, blue));
            gd.drawString(code, (i + 1) * xx, codeY);

            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        // 将四位数字的验证码保存到Session中。
        HttpSession session = req.getSession();
        System.out.print(randomCode);
        session.setAttribute("code", randomCode.toString());
		req.setAttribute("code",randomCode.toString());
        // 禁止图像缓存。
        resp.setHeader("Pragma", "no-cache");
        resp.setHeader("Cache-Control", "no-cache");
        resp.setDateHeader("Expires", 0);

        resp.setContentType("image/jpeg");

        // 将图像输出到Servlet输出流中。
        ServletOutputStream sos = resp.getOutputStream();
        ImageIO.write(buffImg, "jpeg", sos);
        sos.close();
    }

    @RequestMapping("/home")
    public ModelAndView home(HttpServletRequest req) {
        logger.debug("首页请求FROM：" + req.getRemoteHost());

        ModelAndView mav = new ModelAndView("index");
        mav.addObject("thisdate", DateUtils.getMonthStr());
        return mav;
    }

    @RequestMapping("/checkLogin")
    public
    @ResponseBody
    Object login(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password, @RequestParam(value = "code") String code, HttpServletRequest request) {
        MsgBean msg = new MsgBean();
        if (StringUtils.isNotEmpty(code)) {
            Object codeO = request.getSession().getAttribute("code");
            if (codeO != null && !code.equalsIgnoreCase(codeO.toString())) {
                request.getSession().removeAttribute("code");
                msg.setFailure(1, "验证码不正确！");
                return msg.returnMsg();
            }
        } else {
            msg.setFailure("验证码为空！");
            return msg.returnMsg();
        }
        logger.debug("用户登录：" + username);
        if (Strings.isNullOrEmpty(username) || Strings.isNullOrEmpty(password)) {
            msg.setFailure(1, "用户名和密码不能为空");
            return msg.returnMsg();
        }
        AclUser user = userService.findByName(username);
        if (user != null && MD5Util.MD5(password).equals(user.getPassword())) {
            request.getSession().setAttribute(Constants.LOGINUSER, user);
            //系统设置过期session过期时间
            request.getSession().setMaxInactiveInterval(3 * 60 * 60);
            logger.debug("登录成功: " + username);
            List<String> opKeys = userOpService.getUserKeys(user);
            request.getSession().setAttribute(Constants.USER_OP_KEY, opKeys);
            UserMenuVo menuVo = userOpService.getUserMenu(user);
            request.getSession().setAttribute(Constants.USER_MENU_KEY, menuVo);
            request.getSession().removeAttribute("MSG");

            msg.setFailure(0, "登录成功!");
            return msg.returnMsg();
        } else {
            msg.setFailure(1, "密码输入错误！");
            return msg.returnMsg();
        }
    }

    @RequestMapping("/logout")
    public
    @ResponseBody
    Object logout(HttpServletRequest request) {
        MsgBean msg = new MsgBean();
        request.getSession().removeAttribute(Constants.USER_OP_KEY);
        request.getSession().removeAttribute(Constants.USER_MENU_KEY);
        request.getSession().removeAttribute(Constants.LOGINUSER);
        return msg.returnMsg();
    }


    public boolean checkPass(String pass) {
        return pass.length()>=8 && pass.matches(".*?[a-z]+.*?") && pass.matches(".*?[A-Z]+.*?") && pass.matches(".*?[\\d]+.*?");

    }
}
